package org.jeecg.extra.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.jeecg.extra.utils.I18nMessage;
import org.springframework.validation.FieldError;

/**
 * Spring 验证框架枚举.
 *
 * <p>统一处理Spring验证框架的异常返回信息</p>
 *
 * @author chao.xie
 * @version 1.0.0
 * @创建日期: 2023.12.29
 */
@Getter
@AllArgsConstructor
public enum ValidEnum {

    /**
     * 临时对象，避免模板提示信息中占位符被使用，因枚举对象属于全局对象
     */
    TEMP("Temp", ""),

    /**
     * 空值校验
     */
    NULL("Null", "param.null"),

    /**
     * 非空校验
     */
    NOT_NULL("NotNull", "param.not.null"),

    /**
     * 非空校验
     */
    NOT_BLANK("NotBlank", "param.not.blank"),

    /**
     * 非空校验
     */
    NOT_EMPTY("NotEmpty", "param.not.empty"),

    /**
     * 最小校验
     */
    MIN("Min", "param.min"),

    /**
     * 最大
     */
    MAX("Max", "param.max"),

    /**
     * 长度校验
     */
    SIZE("Size", "param.size"),

    /**
     * 字符串长度校验
     */
    LENGTH("Length", "param.length"),

    /**
     * 验证电子邮箱
     */
    EMAIL("Email", "param.not.email"),

    /**
     * 是否枚举参数类型
     */
    ENUM("EnumParam", "param.not.enum")
    ;

    /**
     * 验证枚举名称
     */
    private String code;

    /**
     * 提示模板
     */
    private String message;

    public ValidEnum setCode(String code){
        this.code  = code;
        return this;
    }

    public ValidEnum setMessage(String message){
        this.message = message;
        return this;
    }

    /**
     * 通过验证错误对象, 获取验证枚举变量.
     *
     * @author chao.xie
     * @创建日期: 2023.12.29
     * @param fieldError
     * @return org.jeecg.common.constant.enums.ValidEnum
     * @since 1.0.0
     */
    public static ValidEnum getInstanceByFieldError(FieldError fieldError) {
        ValidEnum[] validEnums = values();
        ValidEnum ve = TEMP;
        for (ValidEnum validEnum : validEnums) {
            if (validEnum.getCode().equals(fieldError.getCode())) {
                //获取到code注解的值，数组个数一定要与占位符数相同
                Object[] arguments = fieldError.getArguments();
                arguments[0] = fieldError.getField();
                ve.setCode(
                        validEnum.getCode()).setMessage(
                                I18nMessage.bundle("i18n/valid_message")
                                        .getMessage(validEnum.getMessage(), arguments)
                );
                return ve;
            }
        }
        return null;
    }
}
